package com.munichosica.myapp.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.munichosica.myapp.dao.TiendaDao;
import com.munichosica.myapp.dto.Tienda;
import com.munichosica.myapp.exceptions.TiendaDaoException;

public class TiendaDaoImpl implements TiendaDao{
	StringBuilder sql=null;
	StringBuilder sqlSelect=null;
	
	
	public TiendaDaoImpl() {
		sql=new StringBuilder();
		sqlSelect= new StringBuilder();
		sqlSelect.append("SELECT TIECODIGO_I, " +
				"TIENOMBRE_V, TIEDIRECCION_V, TIEREFERENCIA_V, " +
				"TIETELEFONO_V, TIEOPERADOR_C, TIECELULAR_V, " +
				"TIEESTADO_C, TIEUSUARIOREGISTRA_V, TIEFECHAREGISTRA_F," +
				" TIEUSUARIOACTUALIZA_V, TIEFECHAACTUALIZA_F, TIEIP_V " +
				"FROM TIENDA ");
	}
	
	@Override
	public List<Tienda> listarPorCriterio(String criterio, String texto,
			String estado) throws TiendaDaoException {
		sql.append("SELECT TIECODIGO_I, " +
				"TIENOMBRE_V, TIEDIRECCION_V, TIEREFERENCIA_V, " +
				"TIETELEFONO_V, " +
				"CASE TIEOPERADOR_C " +
				"WHEN 'C' THEN 'CLARO' " +
				"WHEN 'M' THEN 'MOVISTAR' " +
				"WHEN 'N' THEN 'NEXTEL' END AS TIEOPERADOR_C, TIECELULAR_V, " +
				"TIEESTADO_C, TIEUSUARIOREGISTRA_V, TIEFECHAREGISTRA_F," +
				" TIEUSUARIOACTUALIZA_V, TIEFECHAACTUALIZA_F, TIEIP_V " +
				"FROM TIENDA "+
				"WHERE TIEESTADO_C LIKE '%"+estado.trim()+"%'");
		if(!criterio.isEmpty()) sql.append(" AND "+criterio.trim()+" LIKE '%"+texto.trim()+"%'");

		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		List<Tienda> lista=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			boolean results=stmt.execute();
			if(results){
				lista=new ArrayList<Tienda>();
				rs=stmt.getResultSet();
				Tienda oTienda=null;
				while(rs.next()){
					oTienda=new Tienda();
					oTienda.setTiecodigoI(rs.getInt("TIECODIGO_I"));
					oTienda.setTienombreV(rs.getString("TIENOMBRE_V"));
					oTienda.setTiedireccionV(rs.getString("TIEDIRECCION_V"));
					oTienda.setTiereferenciaV(rs.getString("TIEREFERENCIA_V"));
					oTienda.setTietelefonoV(rs.getString("TIETELEFONO_V"));
					oTienda.setTieoperadorC(rs.getString("TIEOPERADOR_C"));
					oTienda.setTiecelularV(rs.getString("TIECELULAR_V"));
					oTienda.setTieestadoC(rs.getString("TIEESTADO_C"));
					lista.add(oTienda);
				}
			}
		} catch (SQLException e) {
			throw new TiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		
		return lista;
	}	

	@Override
	public Tienda insertar(Tienda tienda) throws TiendaDaoException {
		sql.append("INSERT INTO TIENDA (tienombre_v, tiedireccion_v, tiereferencia_v, " +
				"tietelefono_v, tieoperador_c, tiecelular_v, " +
				"tieestado_c, tieusuarioregistra_v, tiefecharegistra_f, tieip_v) " +
				"VALUES (?, ?, ?, ?, ?, ?, ?, ?, CURDATE(),?)");
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS);
			stmt.setString(1, tienda.getTienombreV());
			stmt.setString(2, tienda.getTiedireccionV());
			stmt.setString(3, tienda.getTiereferenciaV());
			stmt.setString(4, tienda.getTietelefonoV());
			stmt.setString(5, tienda.getTieoperadorC());
			stmt.setString(6, tienda.getTiecelularV());
			stmt.setString(7, tienda.getTieestadoC());
			stmt.setString(8, tienda.getTieusuarioregistraV());
			stmt.setString(9, tienda.getTieipV());
			int results=stmt.executeUpdate();
			if(results>0){
				rs=stmt.getGeneratedKeys();
				if(rs.next()){
					tienda.setTiecodigoI(rs.getInt(1));
				}
			}
		} catch (SQLException e) {
			throw new TiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return tienda;
	}

	@Override
	public Tienda modificar(Tienda tienda) throws TiendaDaoException {
		sql.append("UPDATE TIENDA SET tienombre_v=?, " +
				"tiedireccion_v=?, tiereferencia_v=?, " +
				"tietelefono_v=?, tieoperador_c=?, " +
				"tiecelular_v=?, " +
				"tieusuarioactualiza_v=?, tiefechaactualiza_f=CURDATE(), " +
				"tieip_v=?, tieestado_c=? " +
				"WHERE tiecodigo_i=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, tienda.getTienombreV());
			stmt.setString(2, tienda.getTiedireccionV());
			stmt.setString(3, tienda.getTiereferenciaV());
			stmt.setString(4, tienda.getTietelefonoV());
			stmt.setString(5, tienda.getTieoperadorC());
			stmt.setString(6, tienda.getTiecelularV());
			stmt.setString(7, tienda.getTieusuarioregistraV());
			stmt.setString(8, tienda.getTieipV());
			stmt.setString(9, tienda.getTieestadoC());
			stmt.setInt(10, tienda.getTiecodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new TiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return tienda;
	}

	@Override
	public Tienda obtener(Integer codigo) throws TiendaDaoException {
		sqlSelect.append("WHERE TIECODIGO_I=?");
		
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		Tienda tienda=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sqlSelect.toString());
			stmt.setInt(1, codigo);
			boolean results=stmt.execute();
			if(results){
				rs=stmt.getResultSet();
				if(rs.next()){
					tienda=new Tienda();
					tienda.setTiecodigoI(rs.getInt("TIECODIGO_I"));
					tienda.setTienombreV(rs.getString("TIENOMBRE_V"));
					tienda.setTiedireccionV(rs.getString("TIEDIRECCION_V"));
					tienda.setTiereferenciaV(rs.getString("TIEREFERENCIA_V"));
					tienda.setTietelefonoV(rs.getString("TIETELEFONO_V"));
					tienda.setTieoperadorC(rs.getString("TIEOPERADOR_C"));
					tienda.setTiecelularV(rs.getString("TIECELULAR_V"));
					tienda.setTieestadoC(rs.getString("TIEESTADO_C"));
				}
			}
		} catch (SQLException e) {
			throw new TiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return tienda;
	}

	@Override
	public void eliminar(Tienda tienda) throws TiendaDaoException {
		sql.append("UPDATE tienda SET tieestado_c='I', " +
				"tieusuarioactualiza_v=?, tiefechaactualiza_f=CURDATE()," +
				"tieip_v=? " +
				"WHERE tiecodigo_i=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, tienda.getTieusuarioactualizaV());
			stmt.setString(2, tienda.getTieipV());
			stmt.setInt(3, tienda.getTiecodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new TiendaDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
	}

	@Override
	public List<Tienda> listarPorAlmacen(String tipoCodigo)
			throws TiendaDaoException {
				sql.append("SELECT TIE.tiecodigo_i AS CODIGO," +
						"TIE.tienombre_v AS TIENDA," +
						"TIE.tiedireccion_v AS DIRECCION," +
						"TIE.tiereferencia_v AS REFERENCIA " +
						"FROM ALMACEN ALM " +
						"INNER JOIN ALMACEN_TIENDA ATI ON ATI.almcodigo_i=ALM.almcodigo_i " +
						"INNER JOIN TIENDA TIE ON TIE.tiecodigo_i=ATI.tiecodigo_i " +
						"WHERE TIE.tieestado_c!='I' " +
						"AND ALM.almcodigo_i=?");
				
				Connection conn=null;
				PreparedStatement stmt=null;
				ResultSet rs=null;
				List<Tienda> lista=null;
				try {
					conn=ResourceManager.getConnection();
					stmt=conn.prepareStatement(sql.toString());
					stmt.setInt(1, Integer.parseInt(tipoCodigo));
					boolean results=stmt.execute();
					if(results){
						lista=new ArrayList<Tienda>();
						rs=stmt.getResultSet();
						Tienda oTienda=null;
						while(rs.next()){
							oTienda=new Tienda();
							oTienda.setTiecodigoI(rs.getInt("CODIGO"));
							oTienda.setTienombreV(rs.getString("TIENDA"));
							oTienda.setTiedireccionV(rs.getString("DIRECCION"));
							oTienda.setTiereferenciaV(rs.getString("REFERENCIA"));
							lista.add(oTienda);
						}
					}
				} catch (SQLException e) {
					throw new TiendaDaoException(e.getMessage(),e);
				} finally{
					ResourceManager.close(rs);
					ResourceManager.close(stmt);
					ResourceManager.close(conn);
				}
				
				return lista;
	}

}
